{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys; sys.path.insert(0, '..')\n",
    "\n",
    "from gquant.dataframe_flow import TaskGraph"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table style=\"border: 2px solid white;\">\n",
       "<tr>\n",
       "<td style=\"vertical-align: top; border: 0px solid white\">\n",
       "<h3 style=\"text-align: left;\">Client</h3>\n",
       "<ul style=\"text-align: left; list-style: none; margin: 0; padding: 0;\">\n",
       "  <li><b>Scheduler: </b>tcp://127.0.0.1:43249</li>\n",
       "  <li><b>Dashboard: </b><a href='http://127.0.0.1:8787/status' target='_blank'>http://127.0.0.1:8787/status</a>\n",
       "</ul>\n",
       "</td>\n",
       "<td style=\"vertical-align: top; border: 0px solid white\">\n",
       "<h3 style=\"text-align: left;\">Cluster</h3>\n",
       "<ul style=\"text-align: left; list-style:none; margin: 0; padding: 0;\">\n",
       "  <li><b>Workers: </b>4</li>\n",
       "  <li><b>Cores: </b>4</li>\n",
       "  <li><b>Memory: </b>270.39 GB</li>\n",
       "</ul>\n",
       "</td>\n",
       "</tr>\n",
       "</table>"
      ],
      "text/plain": [
       "<Client: 'tcp://127.0.0.1:43249' processes=4 threads=4, memory=270.39 GB>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from dask_cuda import LocalCUDACluster\n",
    "cluster = LocalCUDACluster()\n",
    "from dask.distributed import Client\n",
    "client = Client(cluster)\n",
    "client"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can open the status page in the brwoser by following javascript commands"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "<script type=\"text/Javascript\">\n",
       "    function check_status(){\n",
       "        var url = document.location.href;\n",
       "        var index = url.indexOf(':8888');\n",
       "        var status = url.substr(0, index)+\":8787\";\n",
       "        window.open(status,'_blank');\n",
       "    }\n",
       "    check_status();\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import HTML\n",
    "javascript = \"\"\"\n",
    "<script type=\"text/Javascript\">\n",
    "    function check_status(){\n",
    "        var url = document.location.href;\n",
    "        var index = url.indexOf(':8888');\n",
    "        var status = url.substr(0, index)+\":8787\";\n",
    "        window.open(status,'_blank');\n",
    "    }\n",
    "    check_status();\n",
    "</script>\n",
    "\"\"\"\n",
    "HTML(javascript)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Prepare distributed CSV files <span style=\"color:red\">(not necessary if the dataset is already prepared)</span>\n",
    "\n",
    "Following is the code to prepare the dataset as mulitple csv files that we can use dask_cuda to load them"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/envs/rapids/lib/python3.6/site-packages/cudf/io/hdf.py:15: UserWarning: Using CPU via Pandas to read HDF dataset, this may be GPU accelerated in the future\n",
      "  \"Using CPU via Pandas to read HDF dataset, this may \"\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "           datetime    open   close    high     low   asset  volume\n",
      "1870     1990-01-02    1.12    1.12    1.12    1.12      93     0.0\n",
      "1871     1990-01-03    1.00    1.00    1.00    1.00      93    15.6\n",
      "1872     1990-01-04    1.00    1.00    1.00    1.00      93     0.0\n",
      "1873     1990-01-05    1.00    1.00    1.00    1.00      93     0.0\n",
      "1874     1990-01-08    1.00    1.00    1.00    1.00      93     0.6\n",
      "...             ...     ...     ...     ...     ...     ...     ...\n",
      "15865794 2016-05-16  481.32  481.46  487.45  478.24  869599    28.7\n",
      "15865795 2016-05-17  482.67  484.88  493.07  480.01  869599    36.9\n",
      "15865796 2016-05-18  485.58  483.91  489.04  480.81  869599    20.1\n",
      "15865797 2016-05-19  481.03  489.86  491.17  476.10  869599    17.3\n",
      "15865798 2016-05-20  491.35  496.45  499.69  491.35  869599    16.6\n",
      "\n",
      "[19277162 rows x 7 columns]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/envs/rapids/lib/python3.6/site-packages/fsspec/implementations/local.py:33: FutureWarning: The default value of auto_mkdir=True has been deprecated and will be changed to auto_mkdir=False by default in a future release.\n",
      "  FutureWarning,\n"
     ]
    }
   ],
   "source": [
    "import dask.dataframe as dd\n",
    "import os\n",
    "action = \"load\" if os.path.isfile('./.cache/load_csv_data.hdf5') else \"save\"\n",
    "node_csv = {\"id\": \"load_csv_data\",\n",
    "            \"type\": \"CsvStockLoader\",\n",
    "            \"conf\": {\"path\": \"/Project/data/stocks/stock_price_hist.csv.gz\"},\n",
    "            \"inputs\": []}\n",
    "\n",
    "node_sort = {\"id\": \"node_sort\",\n",
    "             \"type\": \"SortNode\",\n",
    "             \"conf\": {\"keys\": ['asset', 'datetime']},\n",
    "             \"inputs\": [\"load_csv_data\"]}\n",
    "task_graph = TaskGraph([node_csv, node_sort])\n",
    "df = task_graph.run(\n",
    "         outputs=['node_sort'],\n",
    "         replace={'load_csv_data': {action: True}})[0]\n",
    "os.makedirs('many-small', exist_ok=True)\n",
    "print(df)\n",
    "df = dd.from_pandas(df.to_pandas(), npartitions=8).to_csv('many-small/*.csv', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "- id: node_csvdata_dask\n",
      "  type: DaskCsvStockLoader\n",
      "  conf:\n",
      "    path: many-small\n",
      "  inputs: []\n",
      "- id: node_minVolume\n",
      "  type: VolumeFilterNode\n",
      "  conf:\n",
      "    min: 50.0\n",
      "  inputs: \n",
      "    - node_csvdata_dask\n",
      "- id: node_sort\n",
      "  type: SortNode\n",
      "  conf:\n",
      "    keys: \n",
      "      - asset\n",
      "      - datetime\n",
      "  inputs: \n",
      "    - node_minVolume\n",
      "- id: node_volumeMean\n",
      "  type: AverageNode\n",
      "  conf:\n",
      "    column: volume\n",
      "  inputs: \n",
      "    - node_sort\n",
      "- id: node_outputCsv\n",
      "  type: OutCsvNode\n",
      "  conf:\n",
      "    path: symbol_volume.csv\n",
      "  inputs:\n",
      "    - node_volumeMean\n"
     ]
    }
   ],
   "source": [
    "!cat ../task_example/dask_task.yaml"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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8XvdTxwu10Gn09GLL75IarWaAgIC6LXXXqOWlhZXl8UGQXd3N2VlZVFSUhKJxWL6xS9+QeXl5a4ua1jgcLmG9957jwICAkitVtOLL75IOp3O1SUxF7BarbRjxw6Kj48nqVRKTz75JC8L18Dh0oeqqirKyMggNzc3euqpp3hNhRERkdlspnfffZf8/PwoOjqaDh486OqShiz++WkvPv30U4wbNw7nz5/H4cOH8Ze//AW+vr6uLosNAW5ubnjkkUdQXFyMxMREzJw5E7/61a/Q3d3t6tKGHlen21Dz8ssvk0gkoieffJJMJpOryxkQ27dvJwAEgGQymavLuaVs376dlEolpaWlkVardXU5QwqHy/8xm820du1acnNzo7ffftvV5TjFjBkzOFycID8/n0JCQighIYFqa2tdXc6QwZtF/+fJJ5/Exx9/jK+++gqPP/64q8thN0ipVCIlJWVQp5mUlIRjx46hs7MTixYtQkdHx6BOf6jicAHwwQcf4J133sG2bdswZ84cV5fDhqGIiAjs2rULpaWl/OX0f277cGloaMCTTz6JZ555RrgINWM3YtSoUfj444+xdetWfPbZZ64ux+Vu+3B5+eWX4eXlhRdffHFQpvfFF19AJBIJXUVFBR588EF4e3vDz88P8+bNw88//+zwupaWFqxfvx4jRoyAu7s7fHx8kJGRge+++85h2JKSEixcuBBqtRoKhQKpqanIycnps6ampiY8+eSTiIqKgru7OwICArB48WKcOHHihtrY2dmJ3//+94iPj4dcLoevry/mz5+Pr776Srj/UX/a1XOelZaW4oEHHoCfn5/Q77e//S1EIhEMBgNyc3OF/s64ct7VZGRkYOXKlXjuuedgtVoHddpDjqt3+riSyWQitVpNr7/++qBPe8GCBQSAFixYQEePHiW9Xk/79+8nT09Pmjhxot2wdXV1FB0dTRqNhnbt2kVarZZKS0tp8eLFJBKJaMuWLcKw5eXl5O3tTaGhobRv3z7S6XR08uRJSktLo6ioKIcdurW1tRQZGUkajYb27NlDOp2OTp8+TdOnTycPDw86evRov9v26KOPklqtpn379pHRaKT6+nr69a9/TQDou+++u6F2XTnPpk+fTt999x0ZDAbKy8sjNzc3ampqIiIihUJB06ZN63fNA6mkpIREIhF98803Lq3D1W7rcPn+++8JAFVU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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "task_graph = TaskGraph.load_taskgraph('../task_example/dask_task.yaml')\n",
    "task_graph.draw(show='ipynb')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "id:node_csvdata_dask process time:0.041s\n",
      "id:node_minVolume process time:0.860s\n",
      "id:node_volumeMean process time:0.110s\n",
      "id:node_outputCsv process time:1.560s\n"
     ]
    }
   ],
   "source": [
    "df = task_graph.run(['node_outputCsv'], {}, profile=True)[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>asset</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>631</td>\n",
       "      <td>350.187622</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>914</td>\n",
       "      <td>267.823241</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1404</td>\n",
       "      <td>2073.026646</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1544</td>\n",
       "      <td>80.645555</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1545</td>\n",
       "      <td>18920.967128</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3679</th>\n",
       "      <td>869577</td>\n",
       "      <td>150.850651</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3680</th>\n",
       "      <td>869584</td>\n",
       "      <td>673.502241</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3681</th>\n",
       "      <td>869589</td>\n",
       "      <td>110.377576</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3682</th>\n",
       "      <td>869590</td>\n",
       "      <td>66.575254</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3683</th>\n",
       "      <td>869592</td>\n",
       "      <td>56.085032</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3684 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       asset        volume\n",
       "0        631    350.187622\n",
       "1        914    267.823241\n",
       "2       1404   2073.026646\n",
       "3       1544     80.645555\n",
       "4       1545  18920.967128\n",
       "...      ...           ...\n",
       "3679  869577    150.850651\n",
       "3680  869584    673.502241\n",
       "3681  869589    110.377576\n",
       "3682  869590     66.575254\n",
       "3683  869592     56.085032\n",
       "\n",
       "[3684 rows x 2 columns]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
